const { validationResult } = require('express-validator');
const Category = require('../models/Category');

class CategoryController {
  // 获取分类列表
  static async getCategories(req, res) {
    try {
      const { parentId, status = 'enabled' } = req.query;
      
      const whereCondition = { status };
      if (parentId !== undefined) {
        whereCondition.parentId = parentId === 'null' ? null : parentId;
      }
      
      const categories = await Category.findAll({
        where: whereCondition,
        order: [['sort_order', 'ASC'], ['id', 'ASC']]
      });
      
      res.json({ success: true, data: categories });
    } catch (error) {
      console.error('获取分类列表失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  // 获取分类详情
  static async getCategoryDetail(req, res) {
    try {
      const category = await Category.findByPk(req.params.id);
      
      if (!category) {
        return res.status(404).json({ success: false, message: '分类不存在' });
      }
      
      res.json({ success: true, data: category });
    } catch (error) {
      console.error('获取分类详情失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  // 创建分类（需要管理员权限）
  static async createCategory(req, res) {
    try {
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.status(400).json({ success: false, message: '验证失败', errors: errors.array() });
      }
      
      const { name, icon, parentId, sortOrder } = req.body;
      
      // 检查父分类是否存在
      if (parentId && parentId !== 'null') {
        const parentCategory = await Category.findByPk(parentId);
        if (!parentCategory) {
          return res.status(400).json({ success: false, message: '父分类不存在' });
        }
      }
      
      const category = await Category.create({
        name,
        icon,
        parent_id: parentId === 'null' ? null : parentId,
        sort_order: sortOrder || 0,
        status: 'enabled'
      });
      
      res.status(201).json({ success: true, message: '分类创建成功', data: category });
    } catch (error) {
      console.error('创建分类失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  // 更新分类（需要管理员权限）
  static async updateCategory(req, res) {
    try {
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.status(400).json({ success: false, message: '验证失败', errors: errors.array() });
      }
      
      const category = await Category.findByPk(req.params.id);
      if (!category) {
        return res.status(404).json({ success: false, message: '分类不存在' });
      }
      
      const { name, icon, parentId, sortOrder, status } = req.body;
      
      // 检查父分类是否存在且不是自己
      if (parentId && parentId !== 'null') {
        if (parentId === req.params.id) {
          return res.status(400).json({ success: false, message: '不能将分类设置为自己的子分类' });
        }
        const parentCategory = await Category.findByPk(parentId);
        if (!parentCategory) {
          return res.status(400).json({ success: false, message: '父分类不存在' });
        }
      }
      
      await category.update({
        name,
        icon,
        parent_id: parentId === 'null' ? null : parentId,
        sort_order: sortOrder,
        status
      });
      
      res.json({ success: true, message: '分类更新成功', data: category });
    } catch (error) {
      console.error('更新分类失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  // 删除分类（需要管理员权限）
  static async deleteCategory(req, res) {
    try {
      const category = await Category.findByPk(req.params.id);
      if (!category) {
        return res.status(404).json({ success: false, message: '分类不存在' });
      }
      
      // 检查是否有子分类
      const hasChildren = await Category.count({ where: { parentId: req.params.id } });
      if (hasChildren > 0) {
        return res.status(400).json({ success: false, message: '该分类下有子分类，无法删除' });
      }
      
      // 检查是否有关联的视频
      const hasVideos = await category.countVideos();
      if (hasVideos > 0) {
        return res.status(400).json({ success: false, message: '该分类下有视频，无法删除' });
      }
      
      await category.destroy();
      
      res.json({ success: true, message: '分类删除成功' });
    } catch (error) {
      console.error('删除分类失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  // 获取顶级分类
  static async getTopCategories(req, res) {
    try {
      const categories = await Category.getTopCategories();
      res.json({ success: true, data: categories });
    } catch (error) {
      console.error('获取顶级分类失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  // 获取分类树
  static async getCategoryTree(req, res) {
    try {
      const tree = await Category.getCategoryTree();
      res.json({ success: true, data: tree });
    } catch (error) {
      console.error('获取分类树失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }
}

module.exports = CategoryController;